package com.guchenbo.example.sasl;

import javax.security.auth.callback.*;
import javax.security.sasl.Sasl;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class ServerSaslExample {
    public static void main(String[] args) {
        try {

            String mechanism = "DIGEST-MD5"; // 选择SASL机制
            String protocol = "example"; // 使用的协议
            String serverName = "myServer"; // 服务器名
            Map<String, String> opts = new HashMap<>();
            // 客户端提供的用户名和密码
            String username = "myUser";
            String password = "myPassword";

            SaslServer saslServer = Sasl.createSaslServer(mechanism, protocol, serverName, opts, new CallbackHandler() {
                @Override
                public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                    for (Callback callback : callbacks) {
                        if (callback instanceof NameCallback) {
                            // 处理用户名
                            NameCallback nameCallback = (NameCallback) callback;
                            nameCallback.setName(username);
                        } else if (callback instanceof PasswordCallback) {
                            // 处理密码
                            PasswordCallback passwordCallback = (PasswordCallback) callback;
                            passwordCallback.setPassword(password.toCharArray());
                        } else {
                            throw new UnsupportedCallbackException(callback, "不支持的回调类型");
                        }
                    }
                }
            });

//            // 获取服务器生成的挑战
//            byte[] response = "hello".getBytes(StandardCharsets.UTF_8);
//
//            byte[] challenge = saslServer.evaluateResponse(new byte[0]);
//
//            // 在实际应用中，将 challenge 发送给客户端并接收客户端的响应
//            // 假设客户端响应为 clientResponse
//
//            // 客户端响应的处理
//            byte[] clientResponse = "hello".getBytes(StandardCharsets.UTF_8);
//
//            // 服务器再次处理客户端的响应
//            byte[] challengeResponse = saslServer.evaluateResponse(clientResponse);
//
//            if (saslServer.isComplete()) {
//                System.out.println("认证成功");
//            } else {
//                System.out.println("认证失败");
//            }
        } catch (SaslException e) {
            e.printStackTrace();
        }
    }
}

